﻿#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    BaseEditor(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    table=P_JOURNAL;
    today=CurrentDate;
    updateFlag=false;

    listModel=new QStringListModel(this);
    ui->listView->setModel(listModel);
    ui->listView->setEditTriggers(QListView::NoEditTriggers);

    updateDateList();
    selectDate=today;
    updateView();
    createMenu();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::updateDateList()
{
    QStringList dateList;
    QSqlQuery query;
    query.exec(QString("select date_ from %1 order by date_ DESC")
               .arg(table));
    while (query.next()) {
        dateList.append(query.value(0).toString());
    }
    if(!dateList.isEmpty())
        listModel->setStringList(dateList);
}

void Widget::updateView()
{
    if(selectDate.isEmpty())
        return;

    QSqlQuery query;
    query.exec(QString("select evt_fin,evt_unfin,evt_fit,evt_remark from %1 where date_='%2'")
               .arg(table)
               .arg(selectDate));
    if(query.next())
    {
        if(selectDate == today)
            updateFlag=true;

        last_fin=query.value(0).toString();
        last_unfin=query.value(1).toString();
        last_fit=query.value(2).toString();
        last_remark=query.value(3).toString();

        if(!last_fin.isEmpty())
            ui->evt_fin->setPlainText(last_fin);
        if(!last_unfin.isEmpty())
            ui->evt_unfin->setPlainText(last_unfin);
        if(!last_fit.isEmpty())
            ui->evt_fit->setPlainText(last_fit);
        if(!last_remark.isEmpty())
            ui->evt_remark->setPlainText(last_remark);
    }
}

void Widget::on_btn_finCopy_clicked()
{
    QString context=ui->evt_fin->toPlainText();
    if(context.isEmpty())
        return;

    qApp->clipboard()->setText(context);
    ui->status->setText(ui->lbl_fin->text() +
                        QStringLiteral(" 已复制到剪贴板"));
}

void Widget::on_btn_unfinCopy_clicked()
{
    QString context=ui->evt_unfin->toPlainText();
    if(context.isEmpty())
        return;

    qApp->clipboard()->setText(context);
    ui->status->setText(ui->lbl_unfin->text() +
                        QStringLiteral(" 已复制到剪贴板"));

}

void Widget::on_btn_fitCopy_clicked()
{
    QString context=ui->evt_fit->toPlainText();
    if(context.isEmpty())
        return;

    qApp->clipboard()->setText(context);
    ui->status->setText(ui->lbl_fit->text() +
                        QStringLiteral(" 已复制到剪贴板"));
}

void Widget::on_btn_remarkCopy_clicked()
{
    QString context=ui->evt_remark->toPlainText();
    if(context.isEmpty())
        return;

    qApp->clipboard()->setText(context);
    ui->status->setText(ui->lbl_remark->text() +
                        QStringLiteral(" 已复制到剪贴板"));
}

void Widget::on_listView_doubleClicked(const QModelIndex &index)
{
    if(index.isValid())
    {
        save();
        selectDate=index.data().toString();
        updateView();
    }
}

void Widget::closeEvent(QCloseEvent *)
{
    save();
}

void Widget::save()
{
    if(selectDate == today)
    {
        QString evt_fin=ui->evt_fin->toPlainText();
        if(evt_fin.isEmpty())
            return;

        QString evt_unfin=ui->evt_unfin->toPlainText();
        QString evt_fit=ui->evt_fit->toPlainText();
        QString evt_remark=ui->evt_remark->toPlainText();

        if(updateFlag)
        {
            int i=0;
            if(evt_fin != last_fin)
            {
                i+=1;
                if(updatePart_Fin(evt_fin))
                    i-=1;
            }

            if(evt_unfin != last_unfin)
            {
                i+=1;
                if(updatePart_Unfin(evt_unfin))
                    i-=1;
            }

            if(evt_fit != last_fit)
            {
                i+=1;
                if(updatePart_Fit(evt_fit))
                    i-=1;
            }

            if(evt_remark != last_remark)
            {
                i+=1;
                if(updatePart_Remark(evt_remark))
                    i-=1;
            }

            if(i != 0)
                QMessageBox::warning(this,QStringLiteral("更新异常"),
                                     QStringLiteral("更新异常，存在未更新的数据！"));
        }
        else
        {
            if(!insertItem(evt_fin,evt_unfin,evt_fit,evt_remark))
            {
                QMessageBox::warning(this,QStringLiteral("保存异常"),
                                     QStringLiteral("保存异常，无法保存！"));
            }
            else
                updateFlag=true;
        }
    }
}

bool Widget::insertItem(const QString &evt_fin,
                        const QString &evt_unfin,
                        const QString &evt_fit,
                        const QString &evt_remark)
{
    QSqlQuery query;
    query.prepare(QString("insert into %1 (date_,evt_fin,evt_unfin,evt_fit,evt_remark) values (?,?,?,?,?)")
                  .arg(table));
    query.addBindValue(today);
    query.addBindValue(evt_fin);
    query.addBindValue(evt_unfin);
    query.addBindValue(evt_fit);
    query.addBindValue(evt_remark);
    if(!query.exec())
    {
        qDebug() << query.lastError().text();
        return false;
    }
    else
        return true;
}

bool Widget::updatePart_Fin(const QString &context)
{
    QSqlQuery query;
    query.exec(QString("update %1 set evt_fin='%2' where date_='%3'")
               .arg(table)
               .arg(context)
               .arg(today));
    if(!query.exec())
    {
        qDebug() << query.lastError().text();
        return false;
    }
    else
        return true;
}

bool Widget::updatePart_Unfin(const QString &context)
{
    QSqlQuery query;
    query.exec(QString("update %1 set evt_unfin='%2' where date_='%3'")
               .arg(table)
               .arg(context)
               .arg(today));
    if(!query.exec())
    {
        qDebug() << query.lastError().text();
        return false;
    }
    else
        return true;
}

bool Widget::updatePart_Fit(const QString &context)
{
    QSqlQuery query;
    query.exec(QString("update %1 set evt_fit='%2' where date_='%3'")
               .arg(table)
               .arg(context)
               .arg(today));
    if(!query.exec())
    {
        qDebug() << query.lastError().text();
        return false;
    }
    else
        return true;
}

bool Widget::updatePart_Remark(const QString &context)
{
    QSqlQuery query;
    query.exec(QString("update %1 set evt_remark='%2' where date_='%3'")
               .arg(table)
               .arg(context)
               .arg(today));
    if(!query.exec())
    {
        qDebug() << query.lastError().text();
        return false;
    }
    else
        return true;
}
